/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.japo.java.swing.igu;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.japo.java.swing.events.GEABola;
import org.japo.java.swing.events.GEAInfDer;
import org.japo.java.swing.events.GEAInfIzq;
import org.japo.java.swing.events.GEASupDer;
import org.japo.java.swing.events.GEASupIzq;
import org.japo.java.swing.events.GET;

/**
 *
 * @author José A. Pacheco Ondoño 
 */
public class IGU extends JFrame {

    // Componentes
    public final JPanel pnlPista;
    public final JLabel lblBola;
    public final JLabel lblPalaSup;
    public final JLabel lblPalaInf;
    public final JLabel lblRed;
    public final JLabel lblMarcadorSup;
    public final JLabel lblMarcadorInf;
    public final JLabel lblRotuloSup;
    public final JLabel lblRotuloInf;

    // Bola
    public final Timer timerBola;
    public final GEABola geaBola;
    public final int RETARDO_BOLA = 20;
    public final boolean DIR_HOR_BOLA_INI = true;      // Derecha
    public final boolean DIR_VER_BOLA_INI = false;     // Abajo
    public boolean dirHorBola = DIR_HOR_BOLA_INI;
    public boolean dirVerBola = DIR_HOR_BOLA_INI;
    public final int PASO_HOR_BOLA_A = 6;
    public final int PASO_HOR_BOLA_M = 4;
    public final int PASO_HOR_BOLA_B = 2;
    public final int PASO_VER_BOLA_A = 4;
    public final int PASO_VER_BOLA_M = 4;
    public final int PASO_VER_BOLA_B = 4;
    public final int ANCHO_BOLA = 20;
    public final int ALTO_BOLA = 20;

    // Pala superior
    public Timer timerSupDer;
    public Timer timerSupIzq;
    public GEASupDer geaSupDer;
    public GEASupIzq geaSupIzq;
    public final int PALA_SUP_DER = KeyEvent.VK_D;
    public final int PALA_SUP_IZQ = KeyEvent.VK_A;
    public boolean dirHorPalaSupOK;

    // Pala inferior
    public Timer timerInfDer;
    public Timer timerInfIzq;
    public GEAInfDer geaInfDer;
    public GEAInfIzq geaInfIzq;
    public final int PALA_INF_IZQ = KeyEvent.VK_LEFT;
    public final int PALA_INF_DER = KeyEvent.VK_RIGHT;
    public boolean dirHorPalaInf;

    // Ambas palas
    public final int RETARDO_PALA = 20;
    public final int PASO_PALA = 5;
    public final int MARGEN_PALA = 10;
    public final int ANCHO_PALA = 80;
    public final int ALTO_PALA = 20;

    // Pista
    public final int ANCHO_PISTA = 400;
    public final int ALTO_PISTA = 600;

    // Red
    private final int ALTO_RED = 10;

    // Registro de pulsación de teclas
    public final boolean[] teclaPulsada = new boolean[256];

    // Marcadores
    private final String MARCADOR_INICIAL = "0";
    private final int MARGEN_HOR_MARCADOR = 0;
    private final int MARGEN_VER_MARCADOR = 20;
    private final int ANCHO_MARCADOR = 130;
    private final int ALTO_MARCADOR = 60;
    private final int MARGEN_EXTRA_VER_MARCADOR = 12;

    // Fuente marcadores
    private final String TIPO_MARCADOR = "West_england";
    private final int ESTILO_MARCADOR = Font.BOLD;
    private final int TALLA_MARCADOR = 90;

    // Rótulos
    private final String ROTULO1 = "Winner!";
    private final String ROTULO2 = "Looser!";
    private final int ANCHO_ROTULO = 300;
    private final int ALTO_ROTULO = 60;
    
    // Fuente rótulos
    private final String TIPO_ROTULO = "West_england";
    private final int ESTILO_ROTULO = Font.BOLD;
    private final int TALLA_ROTULO = 60;

    public IGU() throws HeadlessException {        
        // Eventos de teclado
        GET get = new GET(this);
        
        // Eventos de acción
        geaBola = new GEABola(this);
        geaSupDer = new GEASupDer(this);
        geaSupIzq = new GEASupIzq(this);
        geaInfDer = new GEAInfDer(this);
        geaInfIzq = new GEAInfIzq(this);
        
        // Timers
        timerBola = new Timer(RETARDO_BOLA, geaBola);
        timerSupDer = new Timer(RETARDO_PALA, geaSupDer);
        timerSupIzq = new Timer(RETARDO_PALA, geaSupIzq);
        timerInfDer = new Timer(RETARDO_PALA, geaInfDer);
        timerInfIzq = new Timer(RETARDO_PALA, geaInfIzq);
        
        // Inicia el movimiento de la bola
        timerBola.start();

        // Fuentes
        Font fntMarcador = new Font(TIPO_MARCADOR, ESTILO_MARCADOR, TALLA_MARCADOR);
        Font fntRotulo = new Font(TIPO_ROTULO, ESTILO_ROTULO, TALLA_ROTULO);

        // Tamaños
        Dimension dimPista = new Dimension(ANCHO_PISTA, ALTO_PISTA);
        Dimension dimBola = new Dimension(ANCHO_BOLA, ALTO_BOLA);
        Dimension dimPala = new Dimension(ANCHO_PALA, ALTO_PALA);
        Dimension dimRed = new Dimension(ANCHO_PISTA, ALTO_RED);
        Dimension dimMarcador = new Dimension(ANCHO_MARCADOR, ALTO_MARCADOR);
        Dimension dimRotulo = new Dimension(ANCHO_ROTULO, ALTO_ROTULO);

        // Posición inicial bola
        int xIniBola = (ANCHO_PISTA - ANCHO_BOLA) / 2;
        int yIniBola = (ALTO_PISTA - ALTO_BOLA) / 2;

        // Posición inicial palas
        int xIniPala = (ANCHO_PISTA - ANCHO_PALA) / 2;
        int yIniPalaSup = MARGEN_PALA;
        int yIniPalaInf = ALTO_PISTA - MARGEN_PALA - ALTO_PALA;

        // Posición red
        int xRed = 0;
        int yRed = (ALTO_PISTA - ALTO_RED) / 2;

        // Posición marcadores
        int xMarcador = ANCHO_PISTA - MARGEN_HOR_MARCADOR - ANCHO_MARCADOR;
        int yMarcadorSup = ALTO_PISTA / 2 - MARGEN_VER_MARCADOR - ALTO_MARCADOR;
        int yMarcadorInf = ALTO_PISTA / 2 + MARGEN_VER_MARCADOR + MARGEN_EXTRA_VER_MARCADOR;

        // Posición rótulos
        int xRotulo = (ANCHO_PISTA - ANCHO_ROTULO) / 2;
        int yRotuloSup = (ALTO_PISTA / 2 - ALTO_ROTULO) / 2;
        int yRotuloInf = (ALTO_PISTA * 3 / 2 - ALTO_ROTULO) / 2;
        
        // Bola
        lblBola = new JLabel();
        lblBola.setBackground(Color.RED);
        lblBola.setOpaque(true);
        lblBola.setSize(dimBola);
        lblBola.setLocation(xIniBola, yIniBola);

        // Pala superior
        lblPalaSup = new JLabel();
        lblPalaSup.setBackground(Color.WHITE);
        lblPalaSup.setOpaque(true);
        lblPalaSup.setSize(dimPala);
        lblPalaSup.setLocation(xIniPala, yIniPalaSup);

        // Pala inferior
        lblPalaInf = new JLabel();
        lblPalaInf.setBackground(Color.WHITE);
        lblPalaInf.setOpaque(true);
        lblPalaInf.setSize(dimPala);
        lblPalaInf.setLocation(xIniPala, yIniPalaInf);

        // Marcador superior
        lblMarcadorSup = new JLabel();
        lblMarcadorSup.setText(MARCADOR_INICIAL);
        lblMarcadorSup.setForeground(Color.WHITE);
        lblMarcadorSup.setBackground(Color.BLUE);
        lblMarcadorSup.setOpaque(false);
        lblMarcadorSup.setSize(dimMarcador);
        lblMarcadorSup.setLocation(xMarcador, yMarcadorSup);
        lblMarcadorSup.setFont(fntMarcador);
        lblMarcadorSup.setHorizontalAlignment(JLabel.RIGHT);

        // Marcador inferior
        lblMarcadorInf = new JLabel();
        lblMarcadorInf.setText(MARCADOR_INICIAL);
        lblMarcadorInf.setForeground(Color.WHITE);
        lblMarcadorInf.setBackground(Color.BLUE);
        lblMarcadorInf.setOpaque(false);
        lblMarcadorInf.setSize(dimMarcador);
        lblMarcadorInf.setLocation(xMarcador, yMarcadorInf);
        lblMarcadorInf.setFont(fntMarcador);
        lblMarcadorInf.setHorizontalAlignment(JLabel.RIGHT);

        // Rotulo superior
        lblRotuloSup = new JLabel();
        lblRotuloSup.setText(ROTULO1);
        lblRotuloSup.setForeground(Color.WHITE);
        lblRotuloSup.setBackground(Color.BLUE);
        lblRotuloSup.setOpaque(false);
        lblRotuloSup.setSize(dimRotulo);
        lblRotuloSup.setLocation(xRotulo, yRotuloSup);
        lblRotuloSup.setFont(fntRotulo);
        lblRotuloSup.setHorizontalAlignment(JLabel.CENTER);
        lblRotuloSup.setVisible(false);

        // Rotulo inferior
        lblRotuloInf = new JLabel();
        lblRotuloInf.setText(ROTULO2);
        lblRotuloInf.setForeground(Color.WHITE);
        lblRotuloInf.setBackground(Color.BLUE);
        lblRotuloInf.setOpaque(false);
        lblRotuloInf.setSize(dimRotulo);
        lblRotuloInf.setLocation(xRotulo, yRotuloInf);
        lblRotuloInf.setFont(fntRotulo);
        lblRotuloInf.setHorizontalAlignment(JLabel.CENTER);
        lblRotuloInf.setVisible(false);

        // Red
        lblRed = new JLabel();
        lblRed.setBackground(Color.WHITE);
        lblRed.setOpaque(true);
        lblRed.setSize(dimRed);
        lblRed.setLocation(xRed, yRed);

        // Panel principal
        pnlPista = new JPanel(null);
        pnlPista.setBackground(Color.BLACK);
        pnlPista.setPreferredSize(dimPista);
        pnlPista.add(lblBola);
        pnlPista.add(lblPalaSup);
        pnlPista.add(lblPalaInf);
        pnlPista.add(lblRed);
        pnlPista.add(lblMarcadorSup);
        pnlPista.add(lblMarcadorInf);
        pnlPista.add(lblRotuloSup);
        pnlPista.add(lblRotuloInf);

        // Ventana
        setTitle("JPong 0.1 - joanpaon@gmail.com");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(pnlPista);
        pack();
        setLocationRelativeTo(null);
        addKeyListener(get);
    }

}
